# coding:utf-8
"""
    Author: haojuetrace
    Time: 2023-09-17
"""
import os
import hashlib

tmp_md5_path = './tmp_md5'

def get_file_md5(file_name):
    """
    计算文件的md5
    :param file_name:
    :return:
    """
    m = hashlib.md5()  # 创建md5对象
    with open(file_name, 'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)  # 更新md5对象

    return m.hexdigest()  # 返回md5对象


def get_str_md5(content):
    """
    计算字符串md5
    :param content:
    :return:
    """
    m = hashlib.md5(content)  # 创建md5对象
    return m.hexdigest()


def md5_list_init():
    """
        初始化md5值列表值
    :return:
    """
    # 定义一个存储md5值列表
    file_list = {}
    # 判断是否存在备份md5值文件
    if os.path.exists(tmp_md5_path):
        # 读取备份md5值文件
        with open(tmp_md5_path, 'r') as file:
            # 一行一行读
            line = file.readline()
            while line:
                # print(line.strip())  # 输出当前行（去除行尾的换行符）
                # 通过----分割行
                lines = line.strip().split('----')
                # 将md5值和文件路径进行绑定
                file_list[lines[0]] = lines[1]
                line = file.readline()
        # 返回存储md5值列表
        return file_list
    else:
        # 返回存储md5值列表
        return file_list


# 计算md5值是否一致
def check_md5(folder_path, file_list):
    """
    用户对比原始的md5值是否与备份的md5值相等，从而判断是否更新了文件
    :param folder_path:  检测的文件夹路径
    :param file_list:   存储md5值列表
    :return: 返回一个存储md5值列表和一个需要更新上传路径的列表
    """
    # 定义一个标识，用于判断是否需要重写MD5值备份文件,默认不写
    write_tmp_md5 = False
    # 定义存储需要更新的文件路径
    update_list = []
    # 递归获取文件夹中所有文件
    for root, _, files in os.walk(folder_path):
        # 循环获取文件名
        for file_name in files:
            # 将文件名和路径合并
            file_path = os.path.join(root, file_name)
            # 判断文件是否是md格式的文件
            if file_path.endswith('md'):
                # 读取文件
                with open(file_path, 'rb') as file:
                    # 以二进制模式读取文件内容
                    content = file.read()
                    # 获取MD5哈希对象
                    md5_hash = get_file_md5(file_path)

                    # 判断文件的MD5值是否为空
                    if file_list.get(file_path) is None:
                        file_list[file_path] = str(md5_hash)
                        write_tmp_md5 = True
                    # 判断文件的MD5值是否等于新获取的
                    if file_list[file_path] != str(md5_hash):
                        print(f"{file_path}，文件更新, ----, {md5_hash}")
                        update_list.append(file_path)
                        # 如不相等更新MD5值
                        file_list[file_path] = str(md5_hash)
                        write_tmp_md5 = True

    # 重写MD5备份文件
    if write_tmp_md5:
        with open(tmp_md5_path, 'w') as w_file:
            # 遍历存储md5值列表
            for key, value in file_list.items():
                # 一行行写入
                w_file.write(f"{key}----{value}\n")

    return {
        "file_list": file_list,
        "update_list": update_list
    }